/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.metier.service.uc6.authentificationLDAP;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.etrs.formathlon.entity.utilisateur.Utilisateur;
import net.etrs.formathlon.metier.utils.constantes.RoleSpring;
import net.etrs.formathlon.persistance.utilisateur.UtilisateurFacade;
import org.springframework.ldap.core.DirContextOperations;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;

/**
 * Classe utilisée par Spring Security pour peupler les droits qu'aura mon utilissateur 
 * principal. Son instanciation est décrite dans l'applicationContext.xml.
 * @author OPIF
 */
public class FormathlonAuthoritiesPopulator implements LdapAuthoritiesPopulator {
    //#######################################
    //##            Attributs              ##
    //#######################################

    /**
     * EJB qui sera peuplé via le constructeur et l'insertion de dépendance est
     * décrit dans l'applicationContext.xml d'où l'absence d'annotation.
     */
    UtilisateurFacade utilisateurFacade;

    //#######################################
    //##            Constructeur           ##
    //#######################################
    /**
     * Constructeur avec paramètre utilisé pour récuperer la facade.
     * @param a_utilisateurFacade 
     */
    public FormathlonAuthoritiesPopulator(UtilisateurFacade a_utilisateurFacade) {
        super();
        utilisateurFacade = a_utilisateurFacade;
    }

    //#######################################
    //##            Methodes               ##
    //#######################################
    /**
     * Méthode appelée pour spring pour peupler les droits de mon utilisateur.
     * On va ici chercher en base les droits et si on ne trouve pas, on va lui 
     * donner un droit ROLE_NONE qui l'empechera de voir autre chose que 
     * les pages publiques.
     * @param dco
     * @param username
     * @return une collection de droit spring
     */
    @Override
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations dco, String username) {
        List<SimpleGrantedAuthority> userPerms = new ArrayList<SimpleGrantedAuthority>();
        try {
            Utilisateur u = utilisateurFacade.getUtilisateurByLogin(username);
            for (RoleSpring listeRoleSpring : u.getListRoleSpring()) {
                userPerms.add(new SimpleGrantedAuthority(listeRoleSpring.getLibelle()));
            }
            if (u.getPersonnel()!=null) {
                userPerms.add(new SimpleGrantedAuthority(RoleSpring.ROLE_UTIL.getLibelle()));
            }
        } catch (Exception ex) {
            Logger.getLogger(FormathlonAuthoritiesPopulator.class.getCanonicalName()).log(Level.SEVERE, null, ex.getMessage());
        }

        if (userPerms.isEmpty()) {
            userPerms.add(new SimpleGrantedAuthority("ROLE_NONE"));
        }

        return userPerms;
    }

    //#######################################
    //##         GETTER ET SETTER          ##
    //#######################################
    /**
     * Getter utilisateurFacade.
     * @return l'utilisateurFacade
     */
    public UtilisateurFacade getUtilisateurFacade() {
        return utilisateurFacade;
    }

    /**
     *  Setter utilisateurFacade.
     * @param utilisateurFacade 
     */
    public void setUtilisateurFacade(UtilisateurFacade utilisateurFacade) {
        this.utilisateurFacade = utilisateurFacade;
    }
}
